Structs (Yapılar)
Struct
lar türkçeye yapılar olarak çevrilmektedir. Aynı alandaki verileri tek başlık altında birleştirerek tek değeri ile erişmemizi sağlayan yapılardır. Rust 3 tip struct
yapısına sahiptir. Bunlar:
name field
: Tüm komponentlere isim vermektedir.tuple like
: Tüm komponentleri oluşma sıralarına göre sınıflandırır.unit like
: Aslında hiçbir componenti yoktur.
olmaktadır.
1) Name Field Struct
Struct
yapılarını struct
anahtar kelimesi ve yanına Camel Case ile yazılan isimle tanımlanmaktadırlar.
struct Kullanici {
}
main()
fonksiyonu dışına herhangi bir fonksiyonun içinde olmadan yazılabilirler.
Structlar daha önce de belirttiğimiz gibi kendimizin veri tipi oluşturmamızı sağlayan yapılardır. Name Field Struct
yapılarında ise veri tipi içerisindeki kaydedileceği ismi ve verinin hangi tipe sahip olacağını tanımlamamız gerekmektedir.
struct Kullanici{
aktiflik_durumu: bool,
kullanici_adi: String,
giris_yapma_sayisi: u32,
}
Artık Kullanici
adında bir veri tipi oluşturduk. Bu veri tipine sahip bir değişen oluşturmak istediğimizde alt kısımda olduğu gibi bir yapı kullanmamız gerekmektedir:
fn main(){
let kullanici1 = Kullanici{aktiflik_durumu: true, kullanici_adi: String::from("Widget"), giris_yapma_sayisi: 0}
}
Artık kullanici1
adında ve Kullanici
türünde bir değişken ürettik. Peki bu değişkenin içerisindeki verilere nasıl erişiyoruz? Burada karşımıza .
işlemleri gelmekte. Struct
ile oluşturduğumuz değişkenlerde bu değişkenin yanına .
koyarak istediğimiz özelliğine erişebiliriz.
println!("Kullanıcı aktif mi? {}", kullanici1.aktiflik_durumu);
println!("Kullanıcının ismi ne? {}", kullanici1.kullanici_adi);
println!("Kullanıcı kaç kez sisteme girmiş? {}", kullanici.giris_yapma_sayisi)
Aynı zamanda belki de Kulanici
tipinde bir değişkeni bizim için oluşturacak bir fonksiyon da yazabiliriz.
fn kullanici_olustur(kullanici_adi: String) -> Kullanici {
Kullanici{
kullanici_adi,
aktiflik_durumu : true,
giris_yapma_sayisi : 1,
}
}
Bu şekilde kullanıcımızı fonksiyon kullanarak oluşturabiliriz. Bu kısımda kullanici_adi
değeri dışındaki parameterlere :
ile bir değer tanımladığımızı görüntüleyebilirsiniz. Bu durumun nedeni Rust'ın parametre olarak girilen kullanici_adi
değişkeni ile Kullanici
struct'ındaki anahtarın aynı olduğunu fark edecek kadar zeki olup otomatik atama sağlamasıdır. Bu yapı yerine kullanici_adi: kullanici_adi
da diyebiliriz ancak gerek bulunmamakta.
Fonksiyonumuzu oluşturduğumuza göre artık çağıra da biliriz.
fn main(){
let kullanici2 = kullanici_olustur(String::from("İrem"));
println!("{}", kullanici1.kullanici_adi); // İrem
}
2) Tuple Like Structs
Tuple like structs
değerleri daha önce de söylediğimiz üzere name field
'a nazaran isimle değil eklenme sırası ile içindeki değişkenleri tanımlamaktadır.
Bu tipte bir tuple struct
oluşturmak için şu şekilde bir tanım yapabiliriz.
struct Koordinatlar(i32,i32,i32);
Sonrasında da herhangi bir fonksiyon içeisinde aynı şekilde çağırabilirim ve içerisindeki değerlere .
notasyonu ve index numarası ile ulaşabilirim:
fn main(){
let kordinat_bilgisi = Koordinatlar(1,2,3);
println!("{}",kordinat_bilgisi.0); //1
}
3) Unit Like Struct
Peki içlerinde veri olmayan Unit like struct
değerleri nasıl tanımlanmakta? Bu değerleri sadece struct
anahtar kelimesi ve CamelCase isimlendirme ile tanımlayabiliriz. İç kısmına birşey koymamamız gerekmektedir.
struct unitTipiStruct;
Peki bu yapılar nerede kullanılmaktadır? Aslında bu yapıyı biz öncesinde kullandık. Bir vektör içerisine belirli sayılar arasında değer oluşturmak için 1..5
ifadesini kullandık. Burada yer alan ..
yapısı struct içerisindeki range
yani aralık değerinin kısaltması olmaktadır. Yani açılınca `1..5 => Range {start:1 ,end:5} ifadesine karşılık gelmektedir.
Bu tip structları ileride daha ayrıntılı görecek olsak da şu anlık bizim için önemli olanlar name field struct
yapıları olmaktadır.